﻿namespace IS.Projecto.ImportarCSVToDatabase
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Xml.Serialization;
    using DataAccessLayer;
    using ImportarCSV;
    using Modelo;
    using Spring.Context;
    using Spring.Context.Support;

    public class Program
    {
        private string _dataPath = "";
        private readonly IDataRepository _dataRepository;
        private readonly IApplicationContext _context;
        private bool _waitForKey;
        private string _xmlPath;

        private static void Main(string[] args)
        {
            var instance = new Program();
            instance.Run(args);
        }

        private Program()
        {
            _context = ContextRegistry.GetContext();
            _context.Name = @"Application context";
            _dataRepository = (IDataRepository)_context.GetObject("DataRepository");
        }

        ~Program()
        {
            ContextRegistry.Clear();
        }

        private void Run(string[] args)
        {
            try
            {

                //Inicializa os argumentos necessários
                foreach (string s in args)
                {
                    string[] pair = s.Split('=');
                    if (pair.Length == 2 && pair[0].ToLower().Equals("csvpath"))
                    {
                        _dataPath = Path.GetFullPath(pair[1]);
                    }
                    else if (pair.Length == 2 && pair[0].ToLower().Equals("xmlpath"))
                    {
                        _xmlPath = Path.GetFullPath(pair[1]);
                    }
                    else if (s.ToLower().Equals("/w"))
                        _waitForKey = true;
                }

                if (!Directory.Exists(_dataPath))
                {
                    Console.WriteLine("Directório de dados não existe!");
                    return;
                }

                //Importar dados de csv
                var importer = new CsvDirectoryImporter(_dataPath);
                importer.Import();

                Console.WriteLine("A gravar {0} Docentes...", importer.ListaDocentes.Count);
                _dataRepository.WriteDocentes(importer.ListaDocentes);
                Console.WriteLine("A gravar {0} Salas...", importer.ListaSalas.Count);
                _dataRepository.WriteSalas(importer.ListaSalas);
                Console.WriteLine("A gravar {0} Horarios...", importer.ListaHorarios.Count);
                _dataRepository.WriteHorarios(importer.ListaHorarios);
                Console.WriteLine("A gravar {0} Inscricoes...", importer.ListaInscricoes.Count);
                _dataRepository.WriteInscricoes(importer.ListaInscricoes);
                Console.WriteLine("A gravar {0} Unidades Curriculares...", importer.ListaUCs.Count);
                _dataRepository.WriteUnidadeCurriculares(importer.ListaUCs);

                //Isto é feito desta forma porque não é possivel carregar os dados dos cursos (apenas o Id),
                //então é assumido que os cursos são fornecidos previamente
                
                var cursos = DeserializeList<Curso>("Cursos", Path.Combine(_xmlPath, "Cursos.xml"));
                Console.WriteLine("A gravar {0} Cursos...", cursos.Count);
                _dataRepository.WriteCursos(cursos);

                Console.WriteLine("Concluido");

                if (_waitForKey)
                {
                    Console.WriteLine("Press any key...");
                    Console.ReadKey();
                }
            }
            catch (Exception error)
            {
                Console.WriteLine(error.Message);
            }
        }

        private static IList<T> DeserializeList<T>(string rootName, string filename)
        {
            Stream filestream = null;
            try
            {
                var root = new XmlRootAttribute(rootName)
                {
                    Namespace = "http://xml.is.estg.org/schema/DataSchema"
                };
                var serializer = new XmlSerializer(typeof(List<T>), root);
                filestream = new FileStream(filename, FileMode.Open);
                var reader = new StreamReader(filestream);

                return (IList<T>)serializer.Deserialize(reader);
            }
            finally
            {
                if (filestream != null)
                    filestream.Close();
            }
        }
    }
}